#pragma once
#include <iostream>
#include <pthread.h>

namespace MutexModule
{
    // 自定义互斥锁类，封装了 pthread_mutex_t 的操作
    class Mutex
    {
    public:
        // 构造函数：初始化互斥锁
        Mutex()
        {
            // 使用 pthread_mutex_init 初始化互斥锁
            // nullptr 表示使用默认的互斥锁属性
            pthread_mutex_init(&_mutex, nullptr);
        }

        // 加锁操作
        void Lock()
        {
            // 调用 pthread_mutex_lock 尝试加锁
            // 如果锁已被其他线程持有，当前线程将阻塞
            int n = pthread_mutex_lock(&_mutex);
            (void)n; // 忽略返回值，实际使用中应检查返回值处理错误
        }

        // 解锁操作
        void Unlock()
        {
            // 调用 pthread_mutex_unlock 释放锁
            // 只有持有锁的线程可以解锁
            int n = pthread_mutex_unlock(&_mutex);
            (void)n; // 忽略返回值，实际使用中应检查返回值处理错误
        }

        // 析构函数：销毁互斥锁
        ~Mutex()
        {
            // 在对象销毁时，释放互斥锁资源
            pthread_mutex_destroy(&_mutex);
        }

    private:
        pthread_mutex_t _mutex; // 内部使用的 pthread 互斥锁
    };

    // RAII 风格的锁管理类，确保互斥锁在作用域结束时自动释放
    class LockGuard
    {
    public:
        // 构造函数：自动加锁
        LockGuard(Mutex &mutex) : _mutex(mutex)
        {
            // 在构造时调用 Mutex 的 Lock 方法加锁
            _mutex.Lock();
        }

        // 析构函数：自动解锁
        ~LockGuard()
        {
            // 在作用域结束时，自动调用 Mutex 的 Unlock 方法释放锁
            _mutex.Unlock();
        }

    private:
        Mutex &_mutex; // 引用一个 Mutex 对象
    };
}